#创建 Docker TLS 证书
#!/bin/bash

echo "############################################ 开始安装 ############################################"

##更新yum源 == 通过脚本无法执行
#yum update
#
#卸载旧版本(如果安装过旧版本的话)== 通过脚本无法执行
yum remove docker  docker-common docker-selinux docker-engine
#安装基础的工具 
yum install -y yum-utils device-mapper-persistent-data lvm2
#添加docker-ce yum仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#安装docker-ce
yum install docker-ce

#重启
systemctl stop docker
sleep 1
systemctl start docker
sleep 1

echo "######################################### 更新docker镜像源 ##########################################"

#更新镜像源
mkdir -p /etc/docker
#在編寫Shell Script時，如果你有echo到某個檔案的需求，你希望寫入檔案時是以附加(append)的方式進行，而不是整個覆蓋的話，你可以使用【>>】來取代【>】
echo '{

 "registry-mirrors": ["https://registry.docker-cn.com","https://y0qd3iq.mirror.aliyuncs.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"]
 
}' > /etc/docker/daemon.json
echo "#################################### 重载守护进程文件，重启 docker###################################"
#重载守护进程文件，重启 docker
echo "重载守护进程文件，重启 docker"
systemctl daemon-reload
systemctl restart docker
#查看加速器是否生效

echo "########################################## 查看加速镜像源 ###########################################"

docker info
###开始生成文件###
echo "########################################## 开始生成ca证书 ###########################################"
HOST=$1
if [ 0"$HOST" = "0" ]; then
	read -p "请输入主机IP或域名:" HOST
fi

#if [ 0"$PASS" = "0" ]; then
#	read -p "请输入证书密码:" PASS
#fi
PASS="madman2021."
echo "########################################## 证书密码:$PASS ###########################################"
#相关配置信息
CountryName="CN"
ProvinceName="sc"
LocalityName="cd"
OrganizationName="lingser"
OrganizationalUnitName="dev"
CommonName="lingser"
EMAIL="liheng@lingser.com"
# 证书安装生成目录
INSTALL_CA_DIR="/docker/ca/"

#切换到生产密钥的目录
if [ ! -d $INSTALL_CA_DIR ];then
  echo "文件夹不存在，开始创建"
  mkdir -p $INSTALL_CA_DIR
else
  echo "文件夹已经存在，进入文件夹"
fi
cd $INSTALL_CA_DIR
chmod -R 777 $INSTALL_CA_DIR
rm -rf ./*
#生成ca私钥(使用aes256加密)
openssl genrsa -aes256 -out ca-key.pem 4096
#生成ca证书，填写配置信息
openssl req -new -x509 -passin "pass:$PASS" -days 36500 -key ca-key.pem -sha256 -out ca.pem -subj "/C=$CountryName/ST=$ProvinceName/L=$LocalityName/O=$OrganizationName/OU=$OrganizationalUnitName/CN=$CommonName/emailAddress=$EMAIL"

#生成server证书私钥文件
openssl genrsa -out server-key.pem 4096
#生成server证书请求文件
openssl req -subj "/CN=$HOST"  -sha256 -new -key server-key.pem -out server.csr

#配置白名单
sh -c "echo subjectAltName = IP:$HOST,IP:0.0.0.0 >> extfile.cnf"
#执行命令，将Docker守护程序密钥的扩展使用属性设置为仅用于服务器身份验证
sh -c 'echo extendedKeyUsage = serverAuth >> extfile.cnf'

#使用CA证书及CA密钥以及上面的server证书请求文件进行签发，生成server自签证书
openssl x509 -req -days 36500 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASS" -CAcreateserial  -out server-cert.pem -extfile extfile.cnf

#生成client证书RSA私钥文件
openssl genrsa -out key.pem 4096
#生成client证书请求文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr

sh -c 'echo "extendedKeyUsage=clientAuth" > extfile.cnf'
#生成client自签证书（根据上面的client私钥文件、client证书请求文件生成）
openssl x509 -req -days 36500 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem  -passin "pass:$PASS" -CAcreateserial -out cert.pem  -extfile extfile.cnf

#更改密钥权限
chmod 0400 ca-key.pem key.pem server-key.pem
#更改密钥权限
chmod 0444 ca.pem server-cert.pem cert.pem
#删除无用文件
rm client.csr server.csr

#归集服务器证书
cd $INSTALL_CA_DIR
cp ./server-*.pem  /etc/docker/
cp ./ca.pem /etc/docker/

echo "###################################### 生成docker-ca证书文件完成 ######################################"

###生成结束###

echo "################################# 开启远程连接访问。warning：需要ca证书 ################################"

APPEBED_STR="ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock \
          --tlsverify --tlscacert=/etc/docker/ca.pem \
          --tlscert=/etc/docker/server-cert.pem \
          --tlskey=/etc/docker/server-key.pem \
          -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
          
DOCKER_SERVICE_PATH="/usr/lib/systemd/system/docker.service"

echo "########################################## 查看原远程配置项 ###########################################"
sed -n -e "13p" $DOCKER_SERVICE_PATH

while true
do
	read -r -p "是否对原配置内容进行替换（y/n）? " input

	case $input in
	    [yY][eE][sS]|[yY])
			echo "Yes"
			echo "############################################ 替换完成 ############################################"

			sed -i "13c$APPEBED_STR" $DOCKER_SERVICE_PATH
			
			echo "#################################### 重载守护进程文件，重启 docker###################################"
			sleep 1
			systemctl daemon-reload 
			sleep 1
			systemctl restart docker
			# 退出无限循环
			exit 1
			;;

	    [nN][oO]|[nN])
			echo "No"
			
			echo "#################################### 重载守护进程文件，重启 docker###################################"
			sleep 1
			systemctl daemon-reload 
			sleep 1
			systemctl restart docker
			# 退出无限循环
			exit 1    	
			;;

	    *)
			echo "Invalid input..."
			;;
	esac
done
# 设置开机启动
systemctl enable docker